/********************************************************************************
 * Project Name		[JavaEE_Web]
 * File Name     	[LoginValidateFilter.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package filter.cases;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import filter.HttpFilter;

/**
 * 检测用户是否登陆的过滤器<br/>
 * 
 * 场景: 系统中的某些页面只有在正常登陆后才可以使用, 用户请求这些页面时要检查session中有无该用户信息,
 * 但在所有必要的页面加上session的判断相当麻烦的事情<br/>
 * 
 * 解决方案: 编写一个用于检测用户是否登陆的过滤器, 如果用户未登录, 则重定向到指的登录页面<br/>
 * 
 * 要求: 需检查的在Session中保存的关键字, 如果用户未登录, 需重定向到指定的页面[URL不包括ContextPath];
 * 不做检查的URL列表[以分号分开, 并且URL中不包括 ContextPath)都要采取可配置的方式<br/>
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
@WebFilter(filterName = "LoginValidateFilter", urlPatterns = "/jsp/filter/*")
public class LoginValidateFilter extends HttpFilter {

	private String userSessionKey;
	private String uncheckedURLs;
	private String redirectURL;

	@Override
	public void init() {
		ServletContext servletContext = this.getFilterConfig().getServletContext();
		userSessionKey = servletContext.getInitParameter("userSessionKey");
		uncheckedURLs = servletContext.getInitParameter("uncheckedURLList");
		redirectURL = servletContext.getInitParameter("redirectPage");
	}

	@Override
	public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		System.out.println("in login validation filter");

		// 得到请求的URL
		String requestURL = request.getServletPath();

		// 检查请求URL是否为不需要检查的URL之一
		List<String> urls = Arrays.asList(uncheckedURLs.split(","));

		// 如果URL不需要拦截
		if (urls.contains(requestURL)) {
			filterChain.doFilter(request, response);
			return;
		}

		// 从Session中查找用户信息, 如果没有则定向到首页
		String userInfo = (String) request.getSession().getAttribute(userSessionKey);
		if (userInfo == null) {
			response.sendRedirect(request.getContextPath() + redirectURL);
			return;
		}

		// 如果有用户信息, 则允许访问
		filterChain.doFilter(request, response);
	}
}
